# decorators.py
import ast
import logging
import traceback
from typing import Optional, Type

from 程序核心代码.mvvm重构.基础定义.基础图形项.节点图形项.节点图形项 import 节点基础图形项
from 程序核心代码.mvvm重构.基础定义.基础模型.ast节点模型基类 import ast节点基础模型
from 程序核心代码.mvvm重构.基础定义.节点管理器.节点注册表全局存储 import 节点注册表, 图形项注册表

# 配置日志记录器
logging.basicConfig(level=logging.ERROR, format='%(asctime)s - %(levelname)s - %(message)s')
日志记录器 = logging.getLogger(__name__)

class 装饰器管理:
    def __init__(self):
        self.调试模式 = False

        # 设置日志等级
        if self.调试模式:
            日志记录器.setLevel(logging.DEBUG)
            日志记录器.debug(f"{self.__class__.__name__}调试模式已开启")
        else:
            日志记录器.setLevel(logging.ERROR)  # 只显示警告及以上级别的日志

        日志记录器.info("装饰器管理类已初始化")

def 注册节点模型(ast类型: type(ast.AST)):
    """
    装饰器，用于注册节点类到全局注册表。

    :param ast类型: 对应的 AST 节点类型
    :return: 类装饰器
    """
    def 装饰器(类对象: Type['ast节点基础模型']) -> Type['ast节点基础模型']:
        if ast类型 in 节点注册表:
            已存在类 = 节点注册表[ast类型]
            错误信息 = (
                f"AST 类型 {ast类型} 已经被 {已存在类.__name__} 类注册，"
                f"不能被 {类对象.__name__} 类重复注册。"
            )
            日志记录器.error(错误信息)
            raise ValueError(错误信息)
        节点注册表[ast类型] = 类对象
        日志记录器.info(f"自动注册节点类: {类对象.__name__} 对应 AST 类型: {ast类型}")
        return 类对象
    return 装饰器

def 注册节点图形项(ast类型: type(ast.AST)):
    """
    装饰器，用于注册图形项类到全局注册表。

    :param ast类型: 对应的 AST 节点类型
    :return: 类装饰器
    """
    def 装饰器(类对象: Type['节点基础图形项']) -> Type['节点基础图形项']:
        if ast类型 in 图形项注册表:
            已存在类 = 图形项注册表[ast类型]
            错误信息 = (
                f"AST 类型 {ast类型} 已经被 {已存在类.__name__} 类注册，"
                f"不能被 {类对象.__name__} 类重复注册。"
            )
            日志记录器.error(错误信息)
            raise ValueError(错误信息)
        图形项注册表[ast类型] = 类对象
        日志记录器.info(f"自动注册图形项类: {类对象.__name__} 对应 AST 类型: {ast类型}")
        return 类对象
    return 装饰器

def 节点模型匹配器(ast节点, 所属节点模型管理器, **kwargs) -> Optional[ast节点基础模型]:
    节点类 = 节点注册表.get(type(ast节点))
    if 节点类:
        if hasattr(节点类, '创建实例'):
            return 节点类.创建实例(ast节点, 所属节点模型管理器, **kwargs)
        else:
            return 节点类(ast节点, 所属节点模型管理器, **kwargs)
    else:
        日志记录器.error(f"节点模型匹配器未实现的AST节点类型: {type(ast节点)}")
        traceback.print_exc()
        return None

def 节点图形项匹配器(节点模型, **kwargs) -> Optional[节点基础图形项]:
    图形项类 = 图形项注册表.get(type(节点模型._ast节点))
    日志记录器.debug("图形项匹配器匹配到的图形项类：%s", 图形项类)
    if 图形项类:
        try:
            return 图形项类(节点模型, **kwargs)
        except TypeError as e:
            日志记录器.error(f"参数类型错误: {e}")
            日志记录器.error(f"节点模型: {节点模型}, 参数: {kwargs}")
            traceback.print_exc()
        except Exception as e:
            日志记录器.error(f"其他错误: {e}")
            日志记录器.error(f"节点模型: {节点模型}, 参数: {kwargs}")
            traceback.print_exc()
    else:
        日志记录器.error(f"节点图形项匹配器未实现的图形项类型: {type(节点模型.节点ast类型.__class__)}")
        return None
#装饰器管理()